package com.hmdp.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;


    @Override
    public Result queryTypeList() {
        // 缓存键
        String cacheKey = "cache:shopType:list";

        // 尝试从 Redis 缓存中获取数据
        Map<Object, Object> shopTypeMap = stringRedisTemplate.opsForHash().entries(cacheKey);
        if (shopTypeMap != null && !shopTypeMap.isEmpty()) {
            // 如果缓存中存在数据，直接解析并返回
            List<ShopType> shopTypes = shopTypeMap.values().stream()
                    .map(json -> JSONUtil.toBean(json.toString(), ShopType.class))
                    .collect(Collectors.toList());
            return Result.ok(shopTypes);
        }

        // 如果缓存中没有数据，从数据库中查询
        List<ShopType> shopTypes = query().orderByAsc("sort").list(); // 假设这是从数据库获取数据的方法
        if (shopTypes == null || shopTypes.isEmpty()) {
            return Result.fail("店铺类型列表为空");
        }

        // 将查询结果存入 Redis 缓存（使用 Hash 结构）
        Map<String, String> hashMap = shopTypes.stream()
                .collect(Collectors.toMap(
                        shopType -> String.valueOf(shopType.getId()), // 使用店铺类型 ID 作为字段名
                        shopType -> JSONUtil.toJsonStr(shopType) // 序列化为 JSON 字符串作为值
                ));
        stringRedisTemplate.opsForHash().putAll(cacheKey, hashMap);
        // 返回查询结果
        return Result.ok(shopTypes);
    }





   /* @Override
    public Result queryTypeList() {
        // 缓存键
        String cacheKey = "cache:shopType:list";

        // 尝试从 Redis 缓存中获取数据
        String shopTypeJson = stringRedisTemplate.opsForValue().get(cacheKey);
        if (StrUtil.isNotBlank(shopTypeJson)) {
            // 如果缓存中存在数据，直接解析并返回
            List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson, ShopType.class);
            return Result.ok(shopTypes);
        }

        // 如果缓存中没有数据，从数据库中查询
        List<ShopType> shopTypes = query().orderByAsc("sort").list(); // 假设这是从数据库获取数据的方法
        if (shopTypes == null || shopTypes.isEmpty()) {
            return Result.fail("店铺类型列表为空");
        }
        // 将查询结果存入 Redis 缓存
        stringRedisTemplate.opsForValue().set(cacheKey, JSONUtil.toJsonStr(shopTypes));
        // 返回查询结果
        return Result.ok(shopTypes);
    }
*/

//    @Override
//    public Result queryTypeList() {
//        String shopType = stringRedisTemplate.opsForValue().get("cache:shopType:list");
//        List<ShopType> shopTypes = JSONUtil.toList(shopType, ShopType.class);
//        if (shopTypes != null) {
//            return Result.success(shopTypes);
//        }
//
//    }

}
